/*

	ts-funciones.prg
	Funciones relacionadas al scroll y las durezas.
	
*/

CONST

	// tipos de durezas a comprobar
	SUELO = 0;
	PARED = 1;
	TECHO = 2;
	LIANA = 3;
	
END


//---------------------------------------------------------------------------------------
FUNCTION isGround(x,y,tipo)
//
// Comprueba la dureza de un punto en el scroll del mapa.
// Devuelve 1 si es igual, 0 en caso contrario.
//

PRIVATE
	tile_fila;
	tile_col;
	tile_x;
	tile_y;
	tile_graph;
	
	color;
END

BEGIN
	// calcula el tile y las coordenadas dentro del tile
	tile_fila = (y/64);
	tile_col = (x/64);
	tile_x = x - (x/64)*64;
	tile_y = y - (y/64)*64;
	
	// obtiene el numero del grafico del tile
	tile_graph = mapa.tiles[tile_col+tile_fila * mapa.ancho] + 50;
	
	// determina el color a comparar dependiendo el parametro
	SWITCH ( tipo )
		CASE SUELO:
			color = ts.suelo;
		END
		CASE PARED:
			color = ts.pared;
		END
		CASE TECHO:
			color = ts.techo;
		END
		CASE LIANA:
			color = ts.liana;
		END
	END
	
	// comprueba la dureza en el numero de grafico obtenido
	IF ( map_get_pixel(ts.fpg, tile_graph, tile_x, tile_y) == color )
	
		debug_mark(x,y); // marca el punto
		
		return 1;	// es dureza
		
	ELSE
	
		return 0;	// no es dureza
		
	END

END

GLOBAL

	// CACHE del ultimo chequeo de suelo
	lastGroundx;
	lastGroundy;
	lastGroundDist;
	
END

//---------------------------------------------------------------------------------------
FUNCTION getFastGroundDistDown(x,y)
//
//	Detecta la distancia al centro del tile
//

PRIVATE

	x_simple;
	y_simple;
	i=0;
	
END

BEGIN


	x_simple	= x/64;
	
	// busca en el cache
	IF ( x_simple == lastGroundx AND y == lastGroundy )
		RETURN lastGroundDist;
	
	// si no lo encuentra realiza el calculo
	ELSE
	
		//print("Comprobar Suelo Simple");
	
		LOOP
			
			// comprueba el suelo para abajo
			IF ( isGround(x_simple*64+32, y + i, SUELO ) )
				
				// guarda en CACHE la posicion
				lastGroundx = x_simple;
				lastGroundy = y;
				lastGroundDist = i;
				
				RETURN i;
			END
			
			// aumenta la distancia de comprobacion
			i++;
			
		END
	END
	

END


//---------------------------------------------------------------------------------------
FUNCTION getGroundDist(x, y)
//
// Calcula y devuelve la distancia entre un punto y el suelo mas cercano.
// Comprueba hacia arriba y hacia abajo
//

PRIVATE
	int i=0;
END

BEGIN

	//print("Comprobacion de suelo Completa");

	LOOP
		
		// comprueba el suelo para abajo
		IF ( isGround(x, y + i, SUELO ) )
		
			debug_mark(x,y+i);
		
			RETURN i;
			BREAK;
		
		// comprueba el suelo para arriba
		ELSEIF ( isGround(x, y - i, SUELO ) )
		
			debug_mark(x,y-i);
			
			RETURN -i;
			BREAK;
			
		END
		
		// aumenta la distancia de comprobacion
		i++;
		
		
		IF (I > 100)
			RETURN i;
			print("COMPROBACION DE SUELO BREAK");
			BREAK;
		END
		
	END

END

//---------------------------------------------------------------------------------------
FUNCTION getGroundDistDown(x, y)
//
// Calcula y devuelve la distancia entre un punto y el suelo mas cercano.
// Comprueba solamente hacia abajo
//

PRIVATE
	int i = 0;
END

BEGIN

	//print("Comprobacion de suelo inferior");

	LOOP
		
		// comprueba el suelo para abajo
		IF ( isGround(x, y + i, SUELO ) )
		
			debug_mark(x,y+i);
			
			RETURN i;
			BREAK;
		END
		
		// aumenta la distancia de comprobacion
		i++;
		
	END
END



//---------------------------------------------------------------------------------------
PROCESS debug_mark(x0,y0)
//
// Marcador de punto
//
PRIVATE
	timer;
END
BEGIN
	IF ( DEBUGMODE )
		file = fpg_test;
		graph = 2;
		LOOP
			x = x0 - ts.x0;
			y = y0 - ts.y0;
			timer++;
			if ( timer > 30 )
				break;
			end
			frame;
		END
	END
END

